import type {
    NavigationGuardNext,
    RouteLocationNormalizedGeneric,
    RouteLocationNormalizedLoadedGeneric,
} from 'vue-router'
import { useUserStore } from '@/store/user'

const routerGuard = async (
    to: RouteLocationNormalizedGeneric,
    _from: RouteLocationNormalizedLoadedGeneric,
    next: NavigationGuardNext
) => {
    const userStore = useUserStore()
    const accessToken = localStorage.getItem('accessToken')

    // 不需要认证的路由直接通过
    if (!to.meta.requiresAuth) {
        next()
        return
    }

    // 检查是否有token
    if (!accessToken) {
        next({ name: 'Login' })
        return
    }

    try {
        // 获取用户信息（如果还没有的话）
        await userStore.fetchUserInfo()
        // 检查管理员权限
        if (
            to.meta.requiresAdmin &&
            !userStore.userInfo.roles?.includes('超级管理员')
        ) {
            next({ name: 'NotFound' })
            return
        }

        // 如果已经登录且访问登录页，重定向到首页
        if (to.name === 'Login') {
            next({ name: 'Home' })
            return
        }

        next()
    } catch (error) {
        // token无效或过期，清除本地存储并跳转到登录页
        localStorage.removeItem('accessToken')
        next({ name: 'Login' })
    }
}

export default routerGuard

/**
 * 全局前置拦截：beforeEach((to,from,next)=>{}) 路由还未跳转
   全局后置拦截：afterEach((to,from,next)=>{}) 路由已跳转
   单个路由拦截：beforeEnter:(to,from,next)=>{} 配置在路由对象
 */
